package com.example.calculate;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.TreeSet;

/**
 * @author houyangfan
 * @version 1.0
 * @date 2022/7/21 11:28
 */
public class CalculateBug {

    public static void main(String[] args) {

        compareBigDecimal();
        //toBigDecimal();
    }


    /**
     * 将小数转为BigDeciaml问题
     * 小数要转为String
     */
    public static void toBigDecimal(){
        System.out.println(new BigDecimal(0.1).add(new BigDecimal(0.2)));
        System.out.println(new BigDecimal("0.1").add(new BigDecimal("0.2")));
    }

    /**
     * Bigdeciaml 比较问题
     * 能否用equals 比较？ 不能，因为BigDecimal在进行equals比较的时候 会比较 BigDecimal 的 value 和 scale
     * 1.0 的 scale 是 1，1 的 scale 是 0，所以结果一定是 false
     * 如果希望只比较vlaue  可以使用compareto
     */
    public static void compareBigDecimal(){
        System.out.println(new BigDecimal("1").equals(new BigDecimal("1.0")));
        System.out.println(new BigDecimal("1").compareTo(new BigDecimal(1.0))==0);

        // 同时会引发比如往Hashset中添加值本来已经存在但是判断不存在的问题
        // 因为hashset 比较的时候会使用equals和hashcode 来进行比较
        HashSet<BigDecimal> hashSet = new HashSet<>();
        hashSet.add(new BigDecimal("1.0"));
        System.out.println(hashSet.contains(new BigDecimal("1")));
        // ①解决这个问题可以使用TreeSet 因为TreeSet 不使用 hashCode 方法，也不使用 equals 比较元素，而是使用 compareTo 方法
        TreeSet<BigDecimal> treeSet = new TreeSet<>();
        treeSet.add(new BigDecimal("1.0"));
        System.out.println(treeSet.contains(new BigDecimal("1")));
        // ② 可以使用stripTrailingZeros 方法去掉尾部的0
        HashSet<BigDecimal> hashSet2 = new HashSet<>();
        hashSet2.add(new BigDecimal("1.0").stripTrailingZeros());
        System.out.println(hashSet2.contains(new BigDecimal("1").stripTrailingZeros()));
    }

}
